#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    resize(750,500);//窗口大小

    QPixmap pixmap(":/image/image/yp.jpg"); // 加载图片
    QPalette palette;
    palette.setBrush(this->backgroundRole(), QBrush(pixmap.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation))); // 调整图片大小以适应窗口大小
    this->setPalette(palette); // 设置调色板
    this->setAutoFillBackground(true); // 自动填充背景
    ui->textEdit->setStyleSheet("QTextEdit { background-color: rgba(255, 255, 255, 128); }");
    ui->textEdit_2->setStyleSheet("QTextEdit { background-color: rgba(255, 255, 255, 128); }");

    setWindowTitle("串口调试助手(●′ω`●)");//窗口标题
    time1= new QTimer(this);
    serial=new QSerialPort(this);
    time1->start(500);//开启一个200ms的定时器
    connect(time1,&QTimer::timeout,this,&Widget::timerEvent);//时间到后，发出timeout信号，触发槽函数timerevent
    ui->comboBox_2->setCurrentIndex(4);
    ui->comboBox_3->setCurrentIndex(3);
    ui->comboBox_4->setCurrentIndex(2);
    ui->comboBox_5->setCurrentIndex(0);
    rx_len=0;
    tx_len=0;
    connect(serial,QSerialPort::readyRead,this,&Widget::serial_port);//当串口有数据时，转到槽
    ui->checkBox->setCheckState(Qt::Checked);//默认选中ascii

}

Widget::~Widget()
{
    delete ui;
}


void Widget::timerEvent()
{

    QStringList newPortStringList;//创建容器
    newPortStringList.clear();
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())//foreach关键字，遍历列表，放到info中
    {
        newPortStringList+=info.portName();//将可用串口的名字放到字符串容器中

        //qDebug()<<newPortStringList;
    }

    if(newPortStringList.size()!=PortStringList.size())
    {
        PortStringList=newPortStringList;//PortStringList是私有成员，是全局的,保存上一次的串口名字
        ui->comboBox->clear();//将下拉栏清空
        ui->comboBox->addItems(PortStringList);//上次串口名字加入
    }


}

void Widget::on_pushButton_clicked()
{
    if(ui->pushButton->text()==QString("打开串口"))
    {
        rx_len=0;
        serial->setPortName(ui->comboBox->currentText());//设置串口名字
        serial->setBaudRate(ui->comboBox_2->currentText().toInt());//设置波特率，注意将text转化为int类型
        switch (ui->comboBox_3->currentText().toInt()) {
        case 5:
            serial->setDataBits(QSerialPort::Data5);
            break;
        case 6:
            serial->setDataBits(QSerialPort::Data6);
            break;
        case 7:
            serial->setDataBits(QSerialPort::Data7);
            break;
        case 8:
            serial->setDataBits(QSerialPort::Data8);
        break;
        default:
            serial->setDataBits(QSerialPort::UnknownDataBits);
            break;
        }

        switch(ui->comboBox_4->currentIndex())//校验位
        {
            case 0:serial->setParity(QSerialPort::EvenParity);break;
            case 1:serial->setParity(QSerialPort::OddParity);break;
            case 2:serial->setParity(QSerialPort::NoParity);break;//没有检验
            default:
                serial->setParity(QSerialPort::UnknownParity);break;//位置校验
        }

        switch (ui->comboBox_5->currentIndex()) {
        case 0:serial->setStopBits(QSerialPort::OneStop);break;
        case 1:serial->setStopBits(QSerialPort::OneAndHalfStop);break;
        case 2:serial->setStopBits(QSerialPort::TwoStop);break;

        default:
            serial->setStopBits(QSerialPort::UnknownStopBits);
            break;
        }

        serial->setFlowControl(QSerialPort::NoFlowControl);
        if(!serial->open(QIODevice::ReadWrite))
        {
            QMessageBox::information(this,"错误提示","无法打开串口",QMessageBox::Ok);
            return;
        }

        //打开串口状态，不可调整串口参数
        ui->comboBox->setEnabled(false);
        ui->comboBox_2->setEnabled(false);
        ui->comboBox_3->setEnabled(false);
        ui->comboBox_4->setEnabled(false);
        ui->comboBox_5->setEnabled(false);

        ui->pushButton->setText("关闭串口");
    }
    else
    {
        serial->close();
        ui->comboBox->setEnabled(true);
        ui->comboBox_2->setEnabled(true);
        ui->comboBox_3->setEnabled(true);
        ui->comboBox_4->setEnabled(true);
        ui->comboBox_5->setEnabled(true);
        ui->pushButton->setText("打开串口");
    }
}

void Widget::serial_port()
{
    qDebug()<<"hello world";
    QString last_rx;
    int length;
    // 获取当前日期和时间
    QDateTime currentDateTime = QDateTime::currentDateTime();

    // 将日期和时间格式化为字符串
    //QString timestamp = currentDateTime.toString("hh:mm:ss");
    int my_hour=currentDateTime.time().hour();
    int my_min=currentDateTime.time().minute();
    int my_sec=currentDateTime.time().second();
    int my_ms = currentDateTime.time().msec();

    QString time_temp=QString("%1:%2:%3:%4").arg(my_hour,2,10,QLatin1Char('0')).arg(my_min,2,10,QLatin1Char('0')).arg(my_sec,2,10,QLatin1Char('0')).arg(my_ms,3,10,QLatin1Char('0'));

    // 将时间戳添加到QTextEdit
    //ui->textEdit->append(timestamp + " - Your text here");


    if(ui->checkBox_3->checkState()!=Qt::Checked)//不处于暂停
    {
        last_rx=ui->textEdit->toPlainText();//获取当前数据的方法
        rx_data=serial->readAll();//从串口接收数据


        //rx_data = QString::fromUtf8(rx_data);//转为UTF-8编码的QString



        rx_len+=rx_data.length();//调用qstring中的方法
        ui->label_10->setText(QString::number(rx_len));//将长度转化为整形
        if(ui->checkBox_2->checkState()==Qt::Checked)//hex
        {
            rx_data=rx_data.toLatin1().toHex();//qstring先转字符串，后转为hex格式
            length=rx_data.length();
            for(int i=0;i<length/2;i++)
            {
                rx_data.insert(2+3*i,' ');
            }
        }
        else//ascii
        {
            rx_data=rx_data.toLatin1();//转为ascii字符串的方法
        }
        last_rx=last_rx.append(time_temp+"[收]>>:");//
        last_rx=last_rx.append(rx_data);//最新接受到的追加到后面
        last_rx=last_rx.append("\n");//每次都要换行

        ui->textEdit->setText(last_rx);//填入字符串，输出
        //ui->textEdit->setWordWrapMode(QTextOption::WordWrap);

    }
}

//三者互斥
void Widget::on_checkBox_clicked()//ASCII
{
    ui->checkBox->setCheckState(Qt::Checked);
    ui->checkBox_2->setCheckState(Qt::Unchecked);
    ui->checkBox_3->setCheckState(Qt::Unchecked);
}

void Widget::on_checkBox_2_clicked()//hex
{
    ui->checkBox->setCheckState(Qt::Unchecked);
    ui->checkBox_2->setCheckState(Qt::Checked);
    ui->checkBox_3->setCheckState(Qt::Unchecked);
}

void Widget::on_checkBox_3_clicked()//暂停
{
    ui->checkBox->setCheckState(Qt::Unchecked);
    ui->checkBox_2->setCheckState(Qt::Unchecked);
    ui->checkBox_3->setCheckState(Qt::Checked);
}

void Widget::on_pushButton_2_clicked()
{
    //将text_edit2中数据发送出去
//    QByteArray byte_array;
//    tx_data=ui->textEdit_2->toPlainText();//获取当前数据
//    byte_array=tx_data.toLatin1();//将当前数据转换为QByteArray类型
//    serial->write(byte_array);//串口发送
//    rx_len+=tx_data.length();//获得长度
//    ui->label_12->setText(QString::number(rx_len));//显示长度
    // 获取当前日期和时间
    QDateTime currentDateTime = QDateTime::currentDateTime();

    // 将日期和时间格式化为字符串
    //QString timestamp = currentDateTime.toString("hh:mm:ss");
    int my_hour=currentDateTime.time().hour();
    int my_min=currentDateTime.time().minute();
    int my_sec=currentDateTime.time().second();
    int my_ms = currentDateTime.time().msec();

    QString time_temp=QString("%1:%2:%3:%4").arg(my_hour,2,10,QLatin1Char('0')).arg(my_min,2,10,QLatin1Char('0')).arg(my_sec,2,10,QLatin1Char('0')).arg(my_ms,3,10,QLatin1Char('0'));


    tx_data=ui->textEdit_2->toPlainText();
    QByteArray temp=tx_data.toLatin1();
    serial->write(temp);
    rx_len+=tx_data.length();
    ui->label_12->setText(QString::number(rx_len));

    QString last_tx;
    last_tx=ui->textEdit->toPlainText();//获取当前数据的方法
    last_tx=last_tx.append(time_temp+"[发]>>:");//
    last_tx=last_tx.append(tx_data);//最新接受到的追加到后面
    last_tx=last_tx.append("\n");//每次都要换行

    ui->textEdit->setText(last_tx);//填入字符串，输出
}

void Widget::on_pushButton_3_clicked()
{
    ui->textEdit->clear();
}

void Widget::on_pushButton_4_clicked()
{
    ui->textEdit_2->clear();
}
